跳到主要内容

2.1-docker compose

Create by fall on 24 Jul 2023 Recently revised in 24 Jul 2023

docker-compose

如果将配置全在命令行里书写,不容易保存,且一次只能生成一个容器,修改和查找上下文也不方便。

以 docker-compose 来运行命令,可以解决上面的问题。即,通过一个 docker-compose.yml 文件生成多个容器。

不同于命令 docker run <image>,docker compose 创建的内容,将自动处于同一个网络环境。

官方文档:

compose 命令

使用下面命令即可运行 compose.yaml

docker-compose up 启动运行内容

  • -d 表示在后台运行
  • 默认会将 compose.yaml 所在的文件夹的名称作为项目名称,将所用到的容器放置在该项目中

查看日志

docker compose logs

关闭 compose

docker compose down 或者直接在可视化界面删除(项目和项目下的容器)。

  • 添加 --volumes 连同 volume 一起删除。

compose 命令可以使用 - 或者 (空格符号) 进行连接

配置项

顶层配置

  • services 定义各个服务的配置,可以指定每个服务的镜像、容器名称、启动命令、端口映射、环境变量等。
  • version 指定 Docker Compose 的版本号
  • volumes 定义数据卷,必须在顶层进行定义,才能在容器中进行使用。
配置项描述
networks定义各个网络的配置,常见的如 bridge、host、overlay 等
volumes定义数据卷的配置,指定数据卷的使用方式。
build指定 Dockerfile 的路径或者一个 URL,用于构建镜像。
image指定镜像的名称或者 ID,用于拉取或者使用一个已经存在的镜像。
ports指定容器内部端口和主机端口之间的映射关系。
environment指定容器的环境变量。
depends_on指定容器之间的依赖关系,如谁依赖谁,启动顺序等。
command指定容器启动时要运行的命令。
restart指定容器在出现故障时应该如何重新启动。常见的配置如,always
healthcheck定义容器的健康检查。
deploy指定服务在 Docker Swarm 中的部署配置。
secrets指定容器中使用的加密密钥和证书等。
configs指定容器中使用的配置文件。
working_dir工作路径

配置对比

docker run -dp 127.0.0.1:3000:3000 \
-w /app -v "$(pwd):/app" \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:18-alpine \
sh -c "yarn install && yarn run dev"
# docker-compose.yml
services:
app:
image: node:18-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 127.0.0.1:3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos

完整配置示例

version: '3'
services:
app:
image: node:18-alpine # 镜像名称以及版本
container_name: my-node # 生成的容器名称
restart: always # 重启 docker 后该容器也重启
command: sh -c "yarn install && yarn run dev"
ports:
- 127.0.0.1:3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos

mysql:
image: mysql:8.0
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
# 需要在最顶层定义 volumes 并且在确定的位置进行引用
volumes:
todo-mysql-data:

自动化部署

使用 docker + jenkins 能实现代码提交到 github 后自动部署环境

  • docker login 进行登录
  • docker login -u username 指定用户名称
  • docker push username/image-name 将镜像推送到 docker hub

应用的使用

参考文章

作者文章名称
爱笑的架构师5分钟带你快速了解Docker和k8s
佳庆docker-compose讲解与安装
官方文档https://docs.docker.com/get-started/02_our_app/